struct ValueIterationParams
{
    // To be filled in before running the learning algorithm
    double discountFactor;
    int maxIterations;
};

class ValueIterationLearner
{
public:
    ValueIterationLearner(ValueIterationParams params, const VI_TRANSFORM_TYPE &transform)
        : _params(params), _transform(transform) {}

    void learnValueFn(const ReplayCollection &replays, const GameModel &model, ValueFunction &valueFn);

private:
    VI_TRANSFORM_TYPE _transform;
    ValueIterationParams _params;

    // TODO: Pull this out into a class of some sort
    double rewardFunction(const Frame &frame);
};